{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "yOWNUYr7EjfR"
      },
      "source": [
        "# Comprehensive Research Report Agents\n",
        "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/MervinPraison/PraisonAI/blob/main/cookbooks/notebooks/comprehensive_research_report_agents.ipynb)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "ejXY19vhEjfU"
      },
      "source": [
        "## Dependencies"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "c_0Xs110EjfV"
      },
      "outputs": [],
      "source": [
        "# Install dependencies without output\n",
        "%pip install langchain_community > /dev/null\n",
        "%pip install praisonai[crewai] > /dev/null\n",
        "%pip install requests > /dev/null"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "LT255z_kEjfX"
      },
      "source": [
        "## Tools"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "id": "qKjTO8nHEjfX"
      },
      "outputs": [],
      "source": [
        "# ToDo: Fix Python related issue with List Index out of range\n",
        "import requests\n",
        "from bs4 import BeautifulSoup\n",
        "from duckduckgo_search import DDGS\n",
        "from praisonai_tools import BaseTool\n",
        "\n",
        "class InternetSearchTool(BaseTool):\n",
        "    name: str = \"InternetSearchTool\"\n",
        "    description: str = \"Search Internet for relevant information based on a query or latest news\"\n",
        "\n",
        "    def _run(self, query: str):\n",
        "        ddgs = DDGS()\n",
        "        results = ddgs.text(keywords=query, region='wt-wt', safesearch='moderate', max_results=5)\n",
        "        return results\n",
        "\n",
        "\n",
        "class WebContentReaderTool(BaseTool):\n",
        "    name: str = \"WebContentReaderTool\"\n",
        "    description: str = \"Fetches and reads the main text content from a specified webpage URL.\"\n",
        "\n",
        "    def _run(self, url: str) -> str:\n",
        "        \"\"\"Reads the content of a webpage and returns up to 5000 characters of text.\"\"\"\n",
        "        try:\n",
        "            response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})\n",
        "            response.raise_for_status()\n",
        "            soup = BeautifulSoup(response.content, 'html.parser')\n",
        "\n",
        "            # Extract and clean the text content\n",
        "            text_content = soup.get_text(separator=\"\\n\", strip=True)\n",
        "            return text_content[:5000]  # Limit content to 5000 characters for brevity\n",
        "        except requests.exceptions.RequestException as e:\n",
        "            return f\"Failed to retrieve content from {url}: {e}\"\n"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "h38emoeaEjfY"
      },
      "source": [
        "## YAML Prompt"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "id": "SkxqHm_8EjfY"
      },
      "outputs": [],
      "source": [
        "agent_yaml = \"\"\"\n",
        "framework: \"crewai\"\n",
        "topic: \"AI in Healthcare Research and Storytelling\"\n",
        "roles:\n",
        "  manager:\n",
        "    role: \"Project Manager\"\n",
        "    backstory: |\n",
        "      With a strategic mindset and a knack for leadership, you excel at guiding teams towards their goals, ensuring projects not only meet but exceed expectations.\n",
        "    goal: |\n",
        "      Coordinate the project to ensure a seamless integration of research findings into compelling narratives.\n",
        "    verbose: true\n",
        "    allow_delegation: true\n",
        "    tools: []\n",
        "\n",
        "  researcher:\n",
        "    role: \"Senior Researcher\"\n",
        "    backstory: |\n",
        "      Driven by curiosity, you're at the forefront of innovation, eager to explore and share knowledge that could change the world.\n",
        "    goal: |\n",
        "      Uncover groundbreaking technologies and historical insights around AI in healthcare.\n",
        "    verbose: true\n",
        "    allow_delegation: true\n",
        "    tools:\n",
        "      - \"InternetSearchTool\"\n",
        "      - \"WebContentReaderTool\"\n",
        "\n",
        "  writer:\n",
        "    role: \"Writer\"\n",
        "    backstory: |\n",
        "      With a flair for simplifying complex topics, you craft engaging narratives that captivate and educate, bringing new discoveries to light in an accessible manner.\n",
        "    goal: |\n",
        "      Narrate compelling tech stories around AI in healthcare.\n",
        "    verbose: true\n",
        "    allow_delegation: true\n",
        "    tools:\n",
        "      - \"InternetSearchTool\"\n",
        "      - \"WebContentReaderTool\"\n",
        "\n",
        "tasks:\n",
        "  list_ideas:\n",
        "    description: |\n",
        "      List 5 interesting ideas to explore for an article about AI in healthcare.\n",
        "    expected_output: |\n",
        "      Bullet point list of 5 ideas for an article.\n",
        "    agent: researcher\n",
        "    tools:\n",
        "      - \"InternetSearchTool\"\n",
        "      - \"WebContentReaderTool\"\n",
        "    async_execution: true\n",
        "\n",
        "  list_important_history:\n",
        "    description: |\n",
        "      Research the history of AI in healthcare and identify the 5 most important events.\n",
        "    expected_output: |\n",
        "      Bullet point list of 5 important events.\n",
        "    agent: researcher\n",
        "    tools:\n",
        "      - \"InternetSearchTool\"\n",
        "      - \"WebContentReaderTool\"\n",
        "    async_execution: true\n",
        "  write_article:\n",
        "    description: |\n",
        "      Compose an insightful article on AI in healthcare, including its history and the latest interesting ideas.\n",
        "    expected_output: |\n",
        "      A 4-paragraph article about AI in healthcare.\n",
        "    agent: writer\n",
        "    context:\n",
        "      - \"list_ideas\"\n",
        "      - \"list_important_history\"\n",
        "    tools:\n",
        "      - \"InternetSearchTool\"\n",
        "      - \"WebContentReaderTool\"\n",
        "    callback: callback_function\n",
        "  manager_task:\n",
        "    description: |\n",
        "      Oversee the integration of research findings and narrative development to produce a final comprehensive report on AI in healthcare. Ensure the research is accurately represented, and the narrative is engaging and informative.\n",
        "    expected_output: |\n",
        "      A final comprehensive report that combines the research findings and narrative on AI in healthcare.\n",
        "    agent: manager\n",
        "    tools: []\n",
        "dependencies: []\n",
        "\"\"\""
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "JZtOnJFvEjfY"
      },
      "source": [
        "## Main"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 339
        },
        "id": "eDP0reqJEjfZ",
        "outputId": "0ab59e76-6363-4c92-c9d9-822afb8ae15b"
      },
      "outputs": [
        {
          "output_type": "error",
          "ename": "IndexError",
          "evalue": "list index out of range",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mIndexError\u001b[0m                                Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-4-438e945ca301>\u001b[0m in \u001b[0;36m<cell line: 13>\u001b[0;34m()\u001b[0m\n\u001b[1;32m     11\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     12\u001b[0m \u001b[0;31m# Run PraisonAI\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 13\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpraisonai\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mrun\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m     14\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m     15\u001b[0m \u001b[0;31m# Print the result\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/praisonai/cli.py\u001b[0m in \u001b[0;36mrun\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    110\u001b[0m         \u001b[0mRun\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mPraisonAI\u001b[0m \u001b[0mapplication\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    111\u001b[0m         \"\"\"\n\u001b[0;32m--> 112\u001b[0;31m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mmain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    113\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    114\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0mmain\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/praisonai/cli.py\u001b[0m in \u001b[0;36mmain\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    256\u001b[0m                 \u001b[0mtools\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtools\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    257\u001b[0m             )\n\u001b[0;32m--> 258\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0magents_generator\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mgenerate_crew_and_kickoff\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    259\u001b[0m             \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mresult\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    260\u001b[0m             \u001b[0;32mreturn\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/praisonai/agents_generator.py\u001b[0m in \u001b[0;36mgenerate_crew_and_kickoff\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    274\u001b[0m             \u001b[0;32mif\u001b[0m \u001b[0mAGENTOPS_AVAILABLE\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    275\u001b[0m                 \u001b[0magentops\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0minit\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mos\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0menviron\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"AGENTOPS_API_KEY\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtags\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"crewai\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 276\u001b[0;31m             \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_run_crewai\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mconfig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtopic\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtools_dict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    277\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    278\u001b[0m     \u001b[0;32mdef\u001b[0m \u001b[0m_run_autogen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mconfig\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtopic\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtools_dict\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/praisonai/agents_generator.py\u001b[0m in \u001b[0;36m_run_crewai\u001b[0;34m(self, config, topic, tools_dict)\u001b[0m\n\u001b[1;32m    465\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlogger\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdebug\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34mf\"Tasks: {crew.tasks}\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    466\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 467\u001b[0;31m         \u001b[0mresponse\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcrew\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkickoff\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    468\u001b[0m         \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34mf\"### Task Output ###\\n{response}\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    469\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/crewai/crew.py\u001b[0m in \u001b[0;36mkickoff\u001b[0;34m(self, inputs)\u001b[0m\n\u001b[1;32m    312\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    313\u001b[0m         \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprocess\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mProcess\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0msequential\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 314\u001b[0;31m             \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_run_sequential_process\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    315\u001b[0m         \u001b[0;32melif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mprocess\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mProcess\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mhierarchical\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    316\u001b[0m             \u001b[0;31m# type: ignore # Unpacking a string is disallowed\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/crewai/crew.py\u001b[0m in \u001b[0;36m_run_sequential_process\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m    408\u001b[0m                 \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_file_handler\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mlog\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0magent\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mrole\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtask\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mtask_output\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mstatus\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"completed\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    409\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 410\u001b[0;31m         \u001b[0mtoken_usage_formatted\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maggregate_token_usage\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtoken_usage\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    411\u001b[0m         \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_finish_execution\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtask_output\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m    412\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/crewai/crew.py\u001b[0m in \u001b[0;36maggregate_token_usage\u001b[0;34m(self, token_usage_list)\u001b[0m\n\u001b[1;32m    545\u001b[0m         return {\n\u001b[1;32m    546\u001b[0m             \u001b[0mkey\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0msum\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mm\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mm\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtoken_usage_list\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mm\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 547\u001b[0;31m             \u001b[0;32mfor\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtoken_usage_list\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m    548\u001b[0m         }\n",
            "\u001b[0;31mIndexError\u001b[0m: list index out of range"
          ]
        }
      ],
      "source": [
        "import os\n",
        "from praisonai import PraisonAI\n",
        "from google.colab import userdata\n",
        "\n",
        "# Create a PraisonAI instance with the agent_yaml content\n",
        "praisonai = PraisonAI(agent_yaml=agent_yaml, tools=[InternetSearchTool, WebContentReaderTool])\n",
        "\n",
        "# Add OPENAI_API_KEY Secrets to Google Colab on the Left Hand Side 🔑 or Enter Manually Below\n",
        "os.environ[\"OPENAI_API_KEY\"] = userdata.get('OPENAI_API_KEY') or \"ENTER OPENAI_API_KEY HERE\"\n",
        "os.environ[\"OPENAI_MODEL_NAME\"] = \"gpt-5-nano\"\n",
        "\n",
        "# Run PraisonAI\n",
        "result = praisonai.run()\n",
        "\n",
        "# Print the result\n",
        "print(result) # 1/10\n"
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "b_-7Mw3_Janx"
      },
      "execution_count": null,
      "outputs": []
    }
  ],
  "metadata": {
    "language_info": {
      "name": "python"
    },
    "colab": {
      "provenance": []
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}